/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package classes;

/**
 *
 * @author fabian
 */
public class Spielfeld {

    private int[][] feld;
    private int feldlaengeSpalten = 7;
    private int feldlaengenZeilen = 6;

    // spielernummer1
    // spielernummer2
    public Spielfeld() {
        this.feld = new int[7][6];
    }

    /**
     * Farbe ist 1 oder 2, kein Stein, also leeres Felt ist 0
     * farbe = nummer des spielers
     */
    public void platziereStein(int spalte, int farbe) throws Exception {
        if (this.isSpalteVoll(spalte)) {
            throw new Exception("Spalte ist voll");
        }
        if (!this.isInSpaltenRange(spalte)) {
            throw new Exception("Spaltenangabe ist nicht im Bereich der horizontalen Feldlaenge");
        }
        for (int i = feld[spalte].length - 1; i >= 0; i--) {
            if (feld[spalte][i] == 0) {
                feld[spalte][i] = farbe;
                System.out.println("Spieler " + farbe + " hat in Spalte " + spalte + " gesetzt");
                break;
            }
        }
    }

    public boolean isSpalteVoll(int spalte) {
        if (feld[spalte][0] != 0) {
            return true;
        } else {
            return false;
        }
    }

    public int getSteinAt(int spalte, int reihe) {
        // Hier 6-Reihe, weil unten 0, und bei mir unten 7...
        return feld[spalte][this.feld[spalte].length - reihe];
    }

    public void clearSpielfeld() {
        this.feld = new int[7][6];
    }

    /**
     *Diese Methode prüft ob ein Spieler das Spiel gewonnen hat
     *
     * @return Die Nummer des Gewinners
     */
    public int werHatGewonnen() {
        for (int farbe = 1; farbe < 3; farbe++) {
            for (int i = 0; i < feld.length; i++) {
                for (int j = 0; j < feld[0].length; j++) {
                    if (check(i, j, 1, 0, 1, farbe, 0)) {
                        return farbe;
                    } else if (check(i, j, 0, 1, 1, farbe, 0)) {
                        return farbe;
                    } else if (check(i, j, 1, 1, 1, farbe, 0)) {
                        return farbe;
                    } else if (check(i, j, 1, -1, 1, farbe, 0)) {
                        return farbe;
                    }
                }
            }
        }
        return 0;
    }

    /**
     * Diese Methode Checkt in Feld auf 4 hintereinander in der angegebenen Richtung
     *
     *
     * @param spalte - spalte von der kontrolliert werden soll
     * @param zeile - ab der kontrolliert werden soll
     * @param x - Richtungsangabe der Kontrolle x-Richtung
     * @param y - Richtungsangabe der Kontrolle y-Richtung
     * @param i - Schritte der Kontrolle (norm. 1)
     * @param zuControllierendeFarbe - Die Farbe die Kontrolliert werden soll
     * @param hit - anzugebender Parameter: 0
     * @return
     */
    public boolean check(int spalte, int zeile, int x, int y, int i, int zuControllierendeFarbe, int hit) {
        // System.out.println("Methodenparameter \n " + " | " + spalte + " | " + zeile + " | " +x + " | " + y + " | " + i + " | " + zuControllierendeFarbe + " | " + hit );
        if ((spalte >= (feld.length)) | (spalte < 0)) {
            // System.out.println("spalte zu lang");
            return false;
        }
        if ((zeile >= (feld[0].length)) | (zeile < 0)) {
            // System.out.println("zeile zu lang");
            return false;
        }
        if (feld[spalte][zeile] == zuControllierendeFarbe) {
            if (hit == 3) {
                return true;
            } else {
                return check(spalte + x, zeile + y, x, y, i, zuControllierendeFarbe, hit + 1);
            }
        } else {
            return false;
        }
    }
//
//    @Override
//    protected Object clone(){
//    }

    public boolean isInSpaltenRange(int spalte) {
        if ((spalte < feld.length) & (spalte >= 0)) {
            return true;
        } else {
            return false;
        }
    }

    public boolean isInReiheRange(int reihe) {
        if ((reihe < feld[0].length) & (reihe >= 0)) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public String toString() {
        String s = "";
        for (int i = 0; i < feld[0].length; i++) {
            for (int j = 0; j < feld.length; j++) {
                s = s + "|" + feld[j][i];

            }
            s = s + "|\n";

        }
        return s;
    }

    public int getFeldlaengeSpalten() {
        return feldlaengeSpalten;
    }

    public void setFeldlaengeSpalten(int feldlaengeSpalten) {
        this.feldlaengeSpalten = feldlaengeSpalten;
    }

    public int getFeldlaengenZeilen() {
        return feldlaengenZeilen;
    }

    public void setFeldlaengenZeilen(int feldlaengenZeilen) {
        this.feldlaengenZeilen = feldlaengenZeilen;
    }
}
